package com.hzit.oss.controller.api;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.hzit.common.result.R;
import com.hzit.oss.config.OssProperties;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */
@RestController
@RequestMapping("/api/oss/")
public class OssController {

	/**
	 * 文件上传
	 * @param file
	 * @return
	 */
	@PostMapping("/file/upload")
	public R uploadFile(MultipartFile file,String module) {
		// Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
		// String endpoint = "https://" + OssProperties.ENDPOINT;
		// 填写Bucket名称，例如examplebucket。
		String bucketName = OssProperties.BUCKETNAME;
		// 定义文件名
		// 1. 得到文件后缀名
		String originalFilename = file.getOriginalFilename();
		String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
		// 2. 生成一个主文件名
		String name = UUID.randomUUID().toString().replace("-", "");
		// 3. 生成一个日期文件夹
		String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
		// 4. 最后文件名为
		String fileName = module + "/" + format + "/" + name + suffix;

		// 创建OSSClient实例。
		OSS ossClient = new OSSClientBuilder().build( OssProperties.ENDPOINT,OssProperties.ACCESSKEY,OssProperties.ACCESSSECRET);
		try {
			// 创建PutObjectRequest对象。
			PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName,file.getInputStream());
			// 创建PutObject请求。
			PutObjectResult result = ossClient.putObject(putObjectRequest);
		} catch (OSSException | IOException oe) {
			oe.printStackTrace();
		} finally {
			if (ossClient != null) {
				ossClient.shutdown();
			}
		}
		// 5. 定义最后返回的url地址
		String url = "https://" + OssProperties.BUCKETNAME + "." + OssProperties.ENDPOINT + "/" + fileName;
		// 6. 最后返回
		return R.ok().data("url",url);
	}

	/**
	 * 删除文件
	 * @param url
	 * @return
	 */
	@DeleteMapping("/file/remove")
	public R removeFile(String url){

		System.out.println("url = " + url);
		// 填写Bucket名称，例如examplebucket。
		String bucketName = OssProperties.BUCKETNAME;
		// 从模块名字开始计算的文件名
		String objectName = url.replace("https://" + OssProperties.BUCKETNAME + "." + OssProperties.ENDPOINT + "/","");
		// 创建OSSClient实例。
		OSS ossClient = new OSSClientBuilder().build(OssProperties.ENDPOINT, OssProperties.ACCESSKEY,OssProperties.ACCESSSECRET);

		try {
			// 删除文件。
			ossClient.deleteObject(bucketName, objectName);
		} catch (OSSException oe) {
			oe.printStackTrace();
		} finally {
			if (ossClient != null) {
				ossClient.shutdown();
			}
		}
		return R.ok();
	}
}
